<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    const p1 = new Promise((resolve, reject) => {
      try {
        console.log("请求数据A")
        // throw new Error("A错误")
        setTimeout(() => {
          console.log("请求A结束....");
          resolve("A数据")
        }, 2000)
      } catch (e) {
        reject(e.message)
      }
    })

    const p2 = new Promise((resolve, reject) => {
      try {
        console.log("请求数据B")
        throw new Error("B错误")
        setTimeout(() => {
          console.log("请求B结束....");
          resolve("B数据")
        }, 2500)
      } catch (e) {
        reject(e.message)
      }
    })


    const p3 = new Promise((resolve, reject) => {
      try {
        console.log("请求数据C")
        // throw new Error("C错误")
        setTimeout(() => {
          console.log("请求C结束....");
          resolve("C数据")
        }, 1000)
      } catch (e) {
        reject(e.message)
      }
    })


    // Promise.all方法:
    //   - 接受一个数组(原则上是iterable类型)作为参数
    //   - all方法默认返回pending状态的promise实例
    //   - 当所有的promise实例全部完成,返回fulfilled状态的实例,值为所有成功的值组成的数组
    //   - 当其中有一个promise实例执行失败,则all方法返回失败的promise实例,值是这个错误值


    // const result = Promise.all([p1, p2, p3]);
    // console.log("result", result);
    // result.then(value => {
    //   console.log("全部完成");
    // }).catch(reason => {
    //   console.log("有错误的", reason);
    // })

    // Promise.allSettled方法:
    //   - 接受一个数组(原则上是iterable类型)作为参数
    //   - allSettled方法只是接受所有promise的结果,把每一个promise结果的值和状态组成一个对象,把对象按照书写顺序依次放入到数组中作为allSettled返回promise实例的值
    //   - allSettled永远返回成功的状态

    // const result=Promise.allSettled([p1,p2,p3])
    // console.log('result',result);



    // Promise.race方法:
    //   - 监听的promise实例中改变状态最快的那一个,无论是成功还是失败
    //   - race的返回值和最快的这个实例保持一致

      //  const result=Promise.race([p1,p2,p3])
      //  console.log('result',result);


    // Promise.any方法:
    //   - 监听的promise实例中最快成功的那个
    //   - any返回的promise实例和最快成功的保持一致
    //   - 如果所有的promise全部失败,则返回rejected状态的promise实例,值为新的错误:AggregateError: All promises were rejected

    //  const result=Promise.any([p1,p2,p3])
    //  console.log('result',result);


    // Promise.resolve:
    //     - 默认返回一个成功的promise实例,值是resolve接受的实参,快速把一个值包装成promise实例
    //     - 如果resolve的参数是一个promise实例,则resolve的返回值和这个实例保持一致
    // const p4 = Promise.resolve(1)
    // console.log('p4', p4);

    // const p5 = Promise.resolve(new Promise((resolve, reject) => {
    //   // reject('err')
    //   resolve(1)
    // }))
    // console.log('p5', p5);

    // Promise.reject:
    //         - 默认返回一个失败的promise实例,值是reject接受的实参(无论这个实参是不是promise实例),快速把一个值包装成promise实例
    const result = Promise.reject(1);
    console.log("result", result);


    const result2 = Promise.reject(new Promise((resolve, reject) => {
      resolve(1)
      // reject("err")
    }));
    console.log("result2", result2);
  </script>
</body>

</html>